library(forecast)
library(tseries)
library(lmtest)
library(Hmisc)
data <- read.csv("WAG_M.csv", sep=",", stringsAsFactors=F)
data <- head(data, -1)
names(data)[1] <- "Date"
names(data)[2] <- "Value"
data$Value <- as.numeric(data$Value)
data$Date <- as.Date(as.yearmon(data$Date, format="%Y-%m"))
tSeries <- ts(data = data$Value, start = as.numeric(c(format(data$Date[1], "%Y"), format(data$Date[1], "%m"))), freq = 12)
plot(tSeries, type="l", ylab="WAG_M", col="red")
grid()

trainSeries <- window(tSeries, end=c(2016,1))
testSeries <- window(tSeries, start=c(2016,2))
D <- 24
STL-декомпозиция ряда:
plot(stl(tSeries, s.window="periodic"))

Оптимальное преобразование Бокса-Кокса и результат его применения:
par(mfrow=c(2,1))
plot(tSeries, ylab="Original series", xlab="", col="red")
grid()
LambdaOpt <- BoxCox.lambda(tSeries)
plot(BoxCox(tSeries, LambdaOpt), ylab="Transformed series", xlab="", col="red")
title(main=toString(round(LambdaOpt, 3)))
grid()

В данном случае преобразование имеет смысл использовать, так как оно хорошо стабилизирует дисперсию. Попробуем округлить параметр и взять \(\lambda=0.3\):

Результат практически такой же. Далее будем использовать \(\lambda=0.3\).
ARIMA
Автоматический подбор модели
Применим функцию auto.arima:
Series: tSeries
ARIMA(2,1,2)(2,1,2)[12]
Box Cox transformation: lambda= 0.2
Coefficients:
ar1 ar2 ma1 ma2 sar1 sar2 sma1 sma2
1.7623 -0.8383 -1.6649 0.7626 -0.6909 0.0150 0.1017 -0.3917
s.e. 0.1902 0.1936 0.2308 0.2278 0.5095 0.1033 0.5038 0.2812
sigma^2 estimated as 0.006947: log likelihood=300.88
AIC=-583.77 AICc=-583.1 BIC=-551.02
Предлагается модель ARIMA(0,1,0)(2,1,2)\(_{12}\). Посмотрим на её остатки:

Остаток симметричный относительно 0, похож на шум, значит хорошо отработало.


| Нормальность |
Шапиро-Уилка |
отвергается |
3.586421110^{-10} == 9.087472e-17 |
| Несмещённость |
Уилкоксона |
отвергается |
0.6895233 == 0.3847784 |
| Стационарность |
KPSS |
отвергается |
0.1 == 0.1 |
Настроив выбранную модель на обучающей выборке, посчитаем её качество на тестовой:
ME RMSE MAE MPE MAPE MASE ACF1 Theil's U
Training set -0.07669967 3.841494 2.553417 0.03242729 1.985713 0.1821145 -0.007336159 NA
Test set 13.01056720 14.883889 13.010567 5.48265396 5.482654 0.9279378 0.659315420 0.6510556
p-value greater than printed p-value
[1] 0.1

Ручной подбор модели
Исходный ряд нестационарен (p<0.01 == 0.01, критерий KPSS); сделаем сезонное дифференцирование:

Ряд стал стационарным (p<0.0105742==0.01057417, критерий KPSS).
Посмотрим на ACF и PACF полученного продифференцированного ряда:

На ACF значимы лаги 1 - 4, 44-47, на PACF — 1. Поищем с помощью auto.arima оптимальную модель полным перебором (stepwise=FALSE) с ограничениями d=1, D=1, max.p=5, max.q=3, max.P=0, max.Q=2, max.order=12:
Series: tSeries
ARIMA(3,1,0)(0,1,1)[12]
Box Cox transformation: lambda= 0.08800602
Coefficients:
ar1 ar2 ar3 sma1
0.1611 0.0580 0.0949 -0.6465
s.e. 0.0598 0.0602 0.0605 0.0454
sigma^2 estimated as 0.00235: log likelihood=453.83
AIC=-897.67 AICc=-897.45 BIC=-879.44
Была найдена более оптимальная по AICc модель — ARIMA(3,1,0)(0,1,1)\(_{12}\). Посмотрим на её остатки:

Отрежем начало ряда остатков и проанализируем их:

Достигаемые уровни значимости критерия Льюнга-Бокса для остатков:

Q-Q plot и гистограмма:

| Нормальность |
Шапиро-Уилка |
отвергается |
2.330884110^{-10} == 2.330884e-10 |
| Несмещённость |
Уилкоксона |
не отвергается |
0.5800223 == 0.5800223 |
| Стационарность |
KPSS |
отвергается |
0.1 == 0.1 |
Настроив выбранную модель на обучающей выборке, посчитаем её качество на тестовой: ARIMA(3,1,0)(0,1,1)\(_{12}\)
ME RMSE MAE MPE MAPE MASE ACF1 Theil's U
Training set -0.06702276 3.840327 2.541343 -0.007023565 1.971246 0.1812533 -0.1452584 NA
Test set 13.80180793 15.431423 13.801808 5.825917293 5.825917 0.9843706 0.6311357 0.6758536

Сравним остатки двух версий аримы, одинаково обрезав их начало так, чтобы у обоих методов они были правильно определены:

Diebold-Mariano Test
data: resres.auto
DM = -0.11962, Forecast horizon = 1, Loss function power = 2, p-value = 0.9049
alternative hypothesis: two.sided
Критерий Диболда-Мариано не обнаруживает значимого различия между качеством прогнозов.
В целом подобранная вручную модель проще, её остатки лучше, а ошибка на тесте меньше, так что остановимся на модели, подобранной вручную.
LS0tCnRpdGxlOiAiUiBOb3RlYm9vayIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKYGBge3J9CmxpYnJhcnkoZm9yZWNhc3QpCmxpYnJhcnkodHNlcmllcykKbGlicmFyeShsbXRlc3QpCmxpYnJhcnkoSG1pc2MpCgpkYXRhIDwtIHJlYWQuY3N2KCJXQUdfTS5jc3YiLCBzZXA9IiwiLCBzdHJpbmdzQXNGYWN0b3JzPUYpCmRhdGEgPC0gaGVhZChkYXRhLCAtMSkKbmFtZXMoZGF0YSlbMV0gPC0gIkRhdGUiCm5hbWVzKGRhdGEpWzJdIDwtICJWYWx1ZSIKCmRhdGEkVmFsdWUgPC0gYXMubnVtZXJpYyhkYXRhJFZhbHVlKQpkYXRhJERhdGUgPC0gYXMuRGF0ZShhcy55ZWFybW9uKGRhdGEkRGF0ZSwgZm9ybWF0PSIlWS0lbSIpKQp0U2VyaWVzIDwtIHRzKGRhdGEgPSBkYXRhJFZhbHVlLCBzdGFydCA9IGFzLm51bWVyaWMoYyhmb3JtYXQoZGF0YSREYXRlWzFdLCAiJVkiKSwgZm9ybWF0KGRhdGEkRGF0ZVsxXSwgIiVtIikpKSwgZnJlcSA9IDEyKQoKcGxvdCh0U2VyaWVzLCB0eXBlPSJsIiwgeWxhYj0iV0FHX00iLCBjb2w9InJlZCIpCmdyaWQoKQoKdHJhaW5TZXJpZXMgPC0gd2luZG93KHRTZXJpZXMsIGVuZD1jKDIwMTYsMSkpCnRlc3RTZXJpZXMgIDwtIHdpbmRvdyh0U2VyaWVzLCBzdGFydD1jKDIwMTYsMikpCkQgPC0gMjQKYGBgClNUTC3QtNC10LrQvtC80L/QvtC30LjRhtC40Y8g0YDRj9C00LA6CmBgYHtyfQpwbG90KHN0bCh0U2VyaWVzLCBzLndpbmRvdz0icGVyaW9kaWMiKSkKYGBgCtCe0L/RgtC40LzQsNC70YzQvdC+0LUg0L/RgNC10L7QsdGA0LDQt9C+0LLQsNC90LjQtSDQkdC+0LrRgdCwLdCa0L7QutGB0LAg0Lgg0YDQtdC30YPQu9GM0YLQsNGCINC10LPQviDQv9GA0LjQvNC10L3QtdC90LjRjzoKYGBge3J9CnBhcihtZnJvdz1jKDIsMSkpCnBsb3QodFNlcmllcywgeWxhYj0iT3JpZ2luYWwgc2VyaWVzIiwgeGxhYj0iIiwgY29sPSJyZWQiKQpncmlkKCkKCkxhbWJkYU9wdCA8LSBCb3hDb3gubGFtYmRhKHRTZXJpZXMpCnBsb3QoQm94Q294KHRTZXJpZXMsIExhbWJkYU9wdCksIHlsYWI9IlRyYW5zZm9ybWVkIHNlcmllcyIsIHhsYWI9IiIsIGNvbD0icmVkIikKdGl0bGUobWFpbj10b1N0cmluZyhyb3VuZChMYW1iZGFPcHQsIDMpKSkKZ3JpZCgpCmBgYArQkiDQtNCw0L3QvdC+0Lwg0YHQu9GD0YfQsNC1INC/0YDQtdC+0LHRgNCw0LfQvtCy0LDQvdC40LUg0LjQvNC10LXRgiDRgdC80YvRgdC7INC40YHQv9C+0LvRjNC30L7QstCw0YLRjCwg0YLQsNC6INC60LDQuiDQvtC90L4g0YXQvtGA0L7RiNC+INGB0YLQsNCx0LjQu9C40LfQuNGA0YPQtdGCINC00LjRgdC/0LXRgNGB0LjRji4K0J/QvtC/0YDQvtCx0YPQtdC8INC+0LrRgNGD0LPQu9C40YLRjCDQv9Cw0YDQsNC80LXRgtGAINC4INCy0LfRj9GC0YwgJFxsYW1iZGE9MC4zJDoKYGBge3IsIGVjaG89RkFMU0UsIGZpZy5oZWlnaHQ9NCwgZmlnLndpZHRoPTEwfQpwbG90KEJveENveCh0U2VyaWVzLCAwLjIpLCB5bGFiPSJUcmFuc2Zvcm1lZCBzZXJpZXMiLCB4bGFiPSIiLCBjb2w9InJlZCIpCnRpdGxlKG1haW49IjAuMiIpCmdyaWQoKQpgYGAKCtCg0LXQt9GD0LvRjNGC0LDRgiDQv9GA0LDQutGC0LjRh9C10YHQutC4INGC0LDQutC+0Lkg0LbQtS4g0JTQsNC70LXQtSDQsdGD0LTQtdC8INC40YHQv9C+0LvRjNC30L7QstCw0YLRjCAkXGxhbWJkYT0wLjMkLgoKYGBge3IsIGVjaG89RkFMU0V9CkxhbWJkYU9wdCA8LSAwLjIKYGBgCgojIyBBUklNQQojIyMg0JDQstGC0L7QvNCw0YLQuNGH0LXRgdC60LjQuSDQv9C+0LTQsdC+0YAg0LzQvtC00LXQu9C4CtCf0YDQuNC80LXQvdC40Lwg0YTRg9C90LrRhtC40Y4gYXV0by5hcmltYToKYGBge3IsIGVjaG89RkFMU0V9CmZpdC5hdXRvIDwtIGF1dG8uYXJpbWEodFNlcmllcywgbGFtYmRhPUxhbWJkYU9wdCkKZml0LmF1dG8KYGBgCgrQn9GA0LXQtNC70LDQs9Cw0LXRgtGB0Y8g0LzQvtC00LXQu9GMIEFSSU1BKDAsMSwwKSgyLDEsMikkX3sxMn0kLiDQn9C+0YHQvNC+0YLRgNC40Lwg0L3QsCDQtdGRINC+0YHRgtCw0YLQutC4OgpgYGB7ciwgZWNobz1GQUxTRSwgZmlnLmhlaWdodD00LjUsIGZpZy53aWR0aD0xMH0KcmVzLmF1dG8gPC0gcmVzaWR1YWxzKGZpdC5hdXRvKQpwbG90KHJlcy5hdXRvKQpgYGAK0J7RgdGC0LDRgtC+0Log0YHQuNC80LzQtdGC0YDQuNGH0L3Ri9C5INC+0YLQvdC+0YHQuNGC0LXQu9GM0L3QviAwLCDQv9C+0YXQvtC2INC90LAg0YjRg9C8LCDQt9C90LDRh9C40YIg0YXQvtGA0L7RiNC+INC+0YLRgNCw0LHQvtGC0LDQu9C+LgpgYGB7ciwgZWNobz1GQUxTRX0KcCA8LSByZXAoMCwgMSwgZnJlcXVlbmN5KHRTZXJpZXMpKjMpCmZvciAoaSBpbiAxOmxlbmd0aChwKSl7CiAgcFtpXSA8LSBCb3gudGVzdChyZXMuYXV0bywgbGFnPWksIHR5cGUgPSAiTGp1bmctQm94IikkcC52YWx1ZQp9CnBsb3QocCwgeGxhYj0iTGFnIiwgeWxhYj0iUC12YWx1ZSIsIHlsaW09YygwLDEpKQphYmxpbmUoaCA9IDAuMDUsIGx0eSA9IDIsIGNvbCA9ICJibHVlIikKYGBgCgpgYGB7ciwgZWNobz1GQUxTRSwgZmlnLmhlaWdodD01LjUsIGZpZy53aWR0aD0xMH0KcGFyKG1mcm93PWMoMSwyKSkKcXFub3JtKHJlcy5hdXRvKQpxcWxpbmUocmVzLmF1dG8sIGNvbD0icmVkIikKaGlzdChyZXMuYXV0bykKYGBgCgrQk9C40L/QvtGC0LXQt9CwICAgICAgICAgICB8INCa0YDQuNGC0LXRgNC40LkgICAgICB8INCg0LXQt9GD0LvRjNGC0LDRgiDQv9GA0L7QstC10YDQutC4IHwg0JTQvtGB0YLQuNCz0LDQtdC80YvQuSDRg9GA0L7QstC10L3RjCDQt9C90LDRh9C40LzQvtGB0YLQuAotLS0tLS0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCtCd0L7RgNC80LDQu9GM0L3QvtGB0YLRjCAgICAgICB8INCo0LDQv9C40YDQvi3Qo9C40LvQutCwICB8INC+0YLQstC10YDQs9Cw0LXRgtGB0Y8gICAgICAgIHwgYHIgc2hhcGlyby50ZXN0KHJlcy5hdXRvKSRwLnZhbHVlYCA9PSA5LjA4NzQ3MmUtMTcK0J3QtdGB0LzQtdGJ0ZHQvdC90L7RgdGC0YwgICAgICB8INCj0LjQu9C60L7QutGB0L7QvdCwICAgIHwg0L7RgtCy0LXRgNCz0LDQtdGC0YHRjyAgICAgICAgfCBgciB3aWxjb3gudGVzdChyZXMuYXV0bykkcC52YWx1ZWAgPT0gMC4zODQ3Nzg0CtCh0YLQsNGG0LjQvtC90LDRgNC90L7RgdGC0YwgICAgIHwgS1BTUyAgICAgICAgICB8INC+0YLQstC10YDQs9Cw0LXRgtGB0Y8gICAgICAgIHwgYHIga3Bzcy50ZXN0KHJlcy5hdXRvKSRwLnZhbHVlYCA9PSAwLjEKCtCd0LDRgdGC0YDQvtC40LIg0LLRi9Cx0YDQsNC90L3Rg9GOINC80L7QtNC10LvRjCDQvdCwINC+0LHRg9GH0LDRjtGJ0LXQuSDQstGL0LHQvtGA0LrQtSwg0L/QvtGB0YfQuNGC0LDQtdC8INC10ZEg0LrQsNGH0LXRgdGC0LLQviDQvdCwINGC0LXRgdGC0L7QstC+0Lk6IApgYGB7ciwgZWNobz1GQUxTRSwgZmlnLmhlaWdodD01LjUsIGZpZy53aWR0aD0xMH0KZml0U2hvcnQgPC0gQXJpbWEodHJhaW5TZXJpZXMsIG9yZGVyPWMoMCwxLDApLCBzZWFzb25hbD1jKDIsMSwyKSwgbGFtYmRhPUxhbWJkYU9wdCkKZmMgICAgICAgPC0gZm9yZWNhc3QoZml0U2hvcnQsIGg9RCkKYWNjdXJhY3koZmMsIHRlc3RTZXJpZXMpCnByaW50KGtwc3MudGVzdChyZXMuYXV0bykkcC52YWx1ZSkKcGxvdChmb3JlY2FzdChmaXRTaG9ydCwgaD1EKSwgeWxhYj0nV0FHX00nLCB4bGFiPSJUaW1lIikKbGluZXModFNlcmllcywgY29sPSJyZWQiKQpgYGAKCiMjIyDQoNGD0YfQvdC+0Lkg0L/QvtC00LHQvtGAINC80L7QtNC10LvQuArQmNGB0YXQvtC00L3Ri9C5INGA0Y/QtCDQvdC10YHRgtCw0YbQuNC+0L3QsNGA0LXQvSAocDxgciBrcHNzLnRlc3QoQm94Q294KHRTZXJpZXMsIExhbWJkYU9wdCkpJHAudmFsdWVgID09IDAuMDEsINC60YDQuNGC0LXRgNC40LkgS1BTUyk7INGB0LTQtdC70LDQtdC8INGB0LXQt9C+0L3QvdC+0LUg0LTQuNGE0YTQtdGA0LXQvdGG0LjRgNC+0LLQsNC90LjQtToKYGBge3IsIGVjaG89RkFMU0UsIGZpZy5oZWlnaHQ9NS41LCBmaWcud2lkdGg9MTB9CnBsb3QoZGlmZihCb3hDb3godFNlcmllcywgTGFtYmRhT3B0KSwgMTIpLCB0eXBlPSJsIiwgY29sPSJyZWQiKQpncmlkKCkKYGBgCtCg0Y/QtCDRgdGC0LDQuyDRgdGC0LDRhtC40L7QvdCw0YDQvdGL0LwgKHA8YHIga3Bzcy50ZXN0KGRpZmYoQm94Q294KHRTZXJpZXMsIExhbWJkYU9wdCksIDEyKSkkcC52YWx1ZWA9PTAuMDEwNTc0MTcsINC60YDQuNGC0LXRgNC40LkgS1BTUykuIAoK0J/QvtGB0LzQvtGC0YDQuNC8INC90LAgQUNGINC4IFBBQ0Yg0L/QvtC70YPRh9C10L3QvdC+0LPQviDQv9GA0L7QtNC40YTRhNC10YDQtdC90YbQuNGA0L7QstCw0L3QvdC+0LPQviDRgNGP0LTQsDoKCmBgYHtyLCBlY2hvPUZBTFNFLCBmaWcuaGVpZ2h0PTUuNSwgZmlnLndpZHRoPTEwfQpwYXIobWZyb3c9YygxLDIpKQphY2YoZGlmZihkaWZmKEJveENveCh0U2VyaWVzLCBMYW1iZGFPcHQpLCAxMiksIDEpLCBsYWcubWF4PTUqMTIsIG1haW49IiIpCnBhY2YoZGlmZihkaWZmKEJveENveCh0U2VyaWVzLCBMYW1iZGFPcHQpLCAxMiksIDEpLCBsYWcubWF4PTUqMTIsIG1haW49IiIpCmBgYAoK0J3QsCBBQ0Yg0LfQvdCw0YfQuNC80Ysg0LvQsNCz0LggMSAtIDQsIDQ0LTQ3LCDQvdCwIFBBQ0Yg4oCUIDEuIArQn9C+0LjRidC10Lwg0YEg0L/QvtC80L7RidGM0Y4gYXV0by5hcmltYSDQvtC/0YLQuNC80LDQu9GM0L3Rg9GOINC80L7QtNC10LvRjCDQv9C+0LvQvdGL0Lwg0L/QtdGA0LXQsdC+0YDQvtC8IChzdGVwd2lzZT1GQUxTRSkg0YEg0L7Qs9GA0LDQvdC40YfQtdC90LjRj9C80LggZD0xLCBEPTEsIG1heC5wPTUsIG1heC5xPTMsIG1heC5QPTAsIG1heC5RPTIsIG1heC5vcmRlcj0xMjoKYGBge3IgZWNobz1GfQpmaXQgPC0gYXV0by5hcmltYSh0U2VyaWVzLCBkPTEsIEQ9MSwgbWF4LnA9NSwgbWF4LnE9MSwgbWF4LlAgPSAwLCBtYXguUSA9IDMsIG1heC5vcmRlciA9IDEyLCBsYW1iZGE9TGFtYmRhT3B0LCBzdGVwd2lzZT1GKQpmaXQKYGBgCgrQkdGL0LvQsCDQvdCw0LnQtNC10L3QsCDQsdC+0LvQtdC1INC+0L/RgtC40LzQsNC70YzQvdCw0Y8g0L/QviBBSUNjINC80L7QtNC10LvRjCDigJQgQVJJTUEoMywxLDApKDAsMSwxKSRfezEyfSQuINCf0L7RgdC80L7RgtGA0LjQvCDQvdCwINC10ZEg0L7RgdGC0LDRgtC60Lg6CmBgYHtyLCBlY2hvPUZBTFNFLCBmaWcuaGVpZ2h0PTQuNSwgZmlnLndpZHRoPTEwfQpyZXMgPC0gcmVzaWR1YWxzKGZpdCkKcGxvdChyZXMpCmBgYArQntGC0YDQtdC20LXQvCDQvdCw0YfQsNC70L4g0YDRj9C00LAg0L7RgdGC0LDRgtC60L7QsiDQuCDQv9GA0L7QsNC90LDQu9C40LfQuNGA0YPQtdC8INC40YU6CmBgYHtyLCBlY2hvPUZBTFNFLCBmaWcuaGVpZ2h0PTgsIGZpZy53aWR0aD0xMH0KcmVzIDwtIHJlc1stYygxOjEzKV0KdHNkaXNwbGF5KHJlcykKYGBgCgrQlNC+0YHRgtC40LPQsNC10LzRi9C1INGD0YDQvtCy0L3QuCDQt9C90LDRh9C40LzQvtGB0YLQuCDQutGA0LjRgtC10YDQuNGPINCb0YzRjtC90LPQsC3QkdC+0LrRgdCwINC00LvRjyDQvtGB0YLQsNGC0LrQvtCyOgpgYGB7ciwgZWNobz1GQUxTRX0KcCA8LSByZXAoMCwgMSwgZnJlcXVlbmN5KHRTZXJpZXMpKjMpCmZvciAoaSBpbiAxOmxlbmd0aChwKSl7CiAgcFtpXSA8LSBCb3gudGVzdChyZXMsIGxhZz1pLCB0eXBlID0gIkxqdW5nLUJveCIpJHAudmFsdWUKfQpwbG90KHAsIHhsYWI9IkxhZyIsIHlsYWI9IlAtdmFsdWUiLCB5bGltPWMoMCwxKSkKYWJsaW5lKGggPSAwLjA1LCBsdHkgPSAyLCBjb2wgPSAiYmx1ZSIpCmBgYAoKUS1RIHBsb3Qg0Lgg0LPQuNGB0YLQvtCz0YDQsNC80LzQsDoKYGBge3IsIGVjaG89RkFMU0UsIGZpZy5oZWlnaHQ9NS41LCBmaWcud2lkdGg9MTB9CnBhcihtZnJvdz1jKDEsMikpCnFxbm9ybShyZXMpCnFxbGluZShyZXMsIGNvbD0icmVkIikKaGlzdChyZXMpCmBgYAoK0JPQuNC/0L7RgtC10LfQsCAgICAgICAgICAgfCDQmtGA0LjRgtC10YDQuNC5ICAgICAgfCDQoNC10LfRg9C70YzRgtCw0YIg0L/RgNC+0LLQtdGA0LrQuCB8INCU0L7RgdGC0LjQs9Cw0LXQvNGL0Lkg0YPRgNC+0LLQtdC90Ywg0LfQvdCw0YfQuNC80L7RgdGC0LgKLS0tLS0tLS0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQrQndC+0YDQvNCw0LvRjNC90L7RgdGC0YwgICAgICAgfCDQqNCw0L/QuNGA0L4t0KPQuNC70LrQsCAgfCDQvtGC0LLQtdGA0LPQsNC10YLRgdGPICAgICAgICB8IGByIHNoYXBpcm8udGVzdChyZXMpJHAudmFsdWVgID09IDIuMzMwODg0ZS0xMArQndC10YHQvNC10YnRkdC90L3QvtGB0YLRjCAgICAgIHwg0KPQuNC70LrQvtC60YHQvtC90LAgICAgfCDQvdC1INC+0YLQstC10YDQs9Cw0LXRgtGB0Y8gICAgIHwgYHIgd2lsY294LnRlc3QocmVzKSRwLnZhbHVlYCA9PSAwLjU4MDAyMjMK0KHRgtCw0YbQuNC+0L3QsNGA0L3QvtGB0YLRjCAgICAgfCBLUFNTICAgICAgICAgIHwg0L7RgtCy0LXRgNCz0LDQtdGC0YHRjyAgICAgICAgfCBgciBrcHNzLnRlc3QocmVzKSRwLnZhbHVlYCA9PSAwLjEKCtCd0LDRgdGC0YDQvtC40LIg0LLRi9Cx0YDQsNC90L3Rg9GOINC80L7QtNC10LvRjCDQvdCwINC+0LHRg9GH0LDRjtGJ0LXQuSDQstGL0LHQvtGA0LrQtSwg0L/QvtGB0YfQuNGC0LDQtdC8INC10ZEg0LrQsNGH0LXRgdGC0LLQviDQvdCwINGC0LXRgdGC0L7QstC+0Lk6CkFSSU1BKDMsMSwwKSgwLDEsMSkkX3sxMn0kIApgYGB7ciwgZWNobz1GQUxTRSwgZmlnLmhlaWdodD01LjUsIGZpZy53aWR0aD0xMH0KZml0U2hvcnQgPC0gQXJpbWEodHJhaW5TZXJpZXMsIG9yZGVyPWMoMywxLDApLCBzZWFzb25hbD1jKDAsMSwxKSwgbGFtYmRhPUxhbWJkYU9wdCkKZmMgICAgICAgPC0gZm9yZWNhc3QoZml0U2hvcnQsIGg9RCkKYWNjdXJhY3koZmMsIHRlc3RTZXJpZXMpCnBsb3QoZm9yZWNhc3QoZml0U2hvcnQsIGg9RCksIHlsYWI9IldBR19NIiwgeGxhYj0iVGltZSIpCmxpbmVzKHRTZXJpZXMsIGNvbD0icmVkIikKYGBgCgrQodGA0LDQstC90LjQvCDQvtGB0YLQsNGC0LrQuCDQtNCy0YPRhSDQstC10YDRgdC40Lkg0LDRgNC40LzRiywg0L7QtNC40L3QsNC60L7QstC+INC+0LHRgNC10LfQsNCyINC40YUg0L3QsNGH0LDQu9C+INGC0LDQuiwg0YfRgtC+0LHRiyDRgyDQvtCx0L7QuNGFINC80LXRgtC+0LTQvtCyINC+0L3QuCDQsdGL0LvQuCDQv9GA0LDQstC40LvRjNC90L4g0L7Qv9GA0LXQtNC10LvQtdC90Ys6CmBgYHtyLCBlY2hvPUZBTFNFLCBmaWcuaGVpZ2h0PTgsIGZpZy53aWR0aD04fQpyZXMgICAgICA8LSAodFNlcmllcyAtIGZpdHRlZChmaXQpKVstYygxOjEzKV0KcmVzLmF1dG8gPC0gKHRTZXJpZXMgLSBmaXR0ZWQoZml0LmF1dG8pKVstYygxOjEzKV0KCnBsb3QocmVzLCByZXMuYXV0bywgeGxpbT1jKG1pbihyZXMsIHJlcy5hdXRvKSwgbWF4KHJlcywgcmVzLmF1dG8pKSwgeWxpbT1jKG1pbihyZXMsIHJlcy5hdXRvKSwgbWF4KHJlcywgcmVzLmF1dG8pKSwgCiAgICAgeGxhYiA9ICJSZXNpZHVhbHMgb2YgbWFudWFsbHkgZm91bmQgbW9kZWwiLCB5bGFiPSJSZXNpZHVhbHMgb2YgYXV0by5hcmltYSBtb2RlbCIpCmdyaWQoKQpsaW5lcyhjKG1pbihyZXMsIHJlcy5hdXRvKSwgbWF4KHJlcywgcmVzLmF1dG8pKSoyLCBjKG1pbihyZXMsIHJlcy5hdXRvKSwgbWF4KHJlcywgcmVzLmF1dG8pKSoyLCBjb2w9InJlZCIpCgpkbS50ZXN0KHJlcywgcmVzLmF1dG8pCmBgYArQmtGA0LjRgtC10YDQuNC5INCU0LjQsdC+0LvQtNCwLdCc0LDRgNC40LDQvdC+INC90LUg0L7QsdC90LDRgNGD0LbQuNCy0LDQtdGCINC30L3QsNGH0LjQvNC+0LPQviDRgNCw0LfQu9C40YfQuNGPINC80LXQttC00YMg0LrQsNGH0LXRgdGC0LLQvtC8INC/0YDQvtCz0L3QvtC30L7Qsi4KCtCSINGG0LXQu9C+0Lwg0L/QvtC00L7QsdGA0LDQvdC90LDRjyDQstGA0YPRh9C90YPRjiDQvNC+0LTQtdC70Ywg0L/RgNC+0YnQtSwg0LXRkSDQvtGB0YLQsNGC0LrQuCDQu9GD0YfRiNC1LCDQsCDQvtGI0LjQsdC60LAg0L3QsCDRgtC10YHRgtC1INC80LXQvdGM0YjQtSwg0YLQsNC6INGH0YLQviDQvtGB0YLQsNC90L7QstC40LzRgdGPINC90LAg0LzQvtC00LXQu9C4LCDQv9C+0LTQvtCx0YDQsNC90L3QvtC5INCy0YDRg9GH0L3Rg9GOLgo=